블로그
카테고리 이동
[금융 파이썬 #3] 파이썬으로 코스피, 코스닥 상장 종목의 주가, 시장 데이터 받기 (pykrx, yfinance 등)
2024. 1. 29. 11:00
작년 하반기에는 Find-A에서 코스피 시장을 기반으로 한 '알고리즘 트레이딩' 을 스터디했었다.
트레이딩 수익률을 극대화하기 위한 팩터 투자 를 중점적으로 봤었는데, 특히 어려움이 많았던 지점이 바로 '백테스팅' 이었다. 좀 더 자세하게 말하자면 '백테스팅을 위한 시장 데이터' 를 구하는 것이 가장 힘들었다. 좀 더 좋은 라이브러리, 좀 더 나은 방법이 없을까 하고 며칠 밤낮을 찾아다녔었다.
물론, 유료 플랫폼으로 코스콤 이나 에프앤가이드 를 써도 되겠지만... 연습 조금 하겠다고 바로 소 잡는 칼을 들이밀기에는 아쉬움이 있으니, 일단은 무료 플랫폼 혹은 라이브러리를 위주로 찾아보았다.
그 결과, 코스피/코스닥 시장 데이터 를 얻기 위한 방법에는 3가지가 있었다.
① 파이썬 오픈 라이브러리 이용: pykrx,yfinance, pandas-datareader, financedatareader 등
② 네이버 증권 웹페이지 크롤링: 말 그대로 페이지 글자를 따오는 것
③ 증권사 제공 Open API 이용: 대신증권, 이베스트투자증권, 한국투자증권 API가 쓸 만하다는 평
크롤링 은 웹페이지 정책에 따라 지속가능하지 않으므로 패스
증권사에서 제공하는 Open API 는 시간당 받을 수 있는 데이터에 한계가 있으니 패스
결국 남은 것은 파이썬 오픈 라이브러리 인데... 매우 다행히도 괜찮은 라이브러리가 있었다.
Pykrx 와 yfinanc e인데 향후에 참고할 수 있도록 기록을 끄적여본다. (2024년 1월 28일 기준)
먼저 Pykrx 라이브러리 를 만들고, 운영하고 계신 분들께 감사의 인사를 드린다.
진짜 Pykrx 라이브러리 가 없었다면 아마 펀더멘털 기반 팩터 투자 는 불가능했을지도 모른다.
pykrx github
Pykrx 는 국내 주식, 채권, ETF, ETN 등 왠만한 자산시장의 각 종목에 대한 데이터를 제공하는 라이브러리이다.
금융공기업이나 금융기관이 아닌 일반 기업에서 만들었기에 공식 라이브러리라고 하기에는 힘들겠지만, 그럼에도 불구하고 정말 다양한 시장 데이터를 불러올 수 있기에 애정할 수 밖에 없다.
- Pykrx에서 조회 가능한 것과 불가능한 것
- 조회 가능한 것 - (주식) 상장 종목(티커), 일일주가/거래량/거래대금/등락률/시가총액/투자자별 매매동향
종목별 지표(DIV, BPS, PER, EPS, PBR), 외국인 보유비율
(인덱스) 종류, 구성 종목, 일일주가/거래량/등락률/지표(PER, 선행PER, PBR, 배당수익률)
상장정보
(공매도) 일일 종목별 공매도 현황 (순공매도량/금액, 잔고/잔고금액), 일일 종목별 공매도 비중
투자자별 공매도 거래 현황 (거래량, 거래대금), 공매도 상위종목 (거래비중/잔고)
(ETF, ETN) 티커/이름, 일일NAV/주가/거래량/거래대금/기초지수/등락률, 구성종목, 괴리율
추적오차율, (투자자별) 거래실적
(채권) KRX에서 제공하는 채권의 수익률 (채권 금리)
- 조회 불가능한 것 - (HFT를 위한) 실시간 주가, 종목별 선행 PER, 배당금
2. Pykrx 사용 시 주의사항
① 액면분할 등 이벤트를 포함하는 긴 기간으로 조회 해야 수정주가 가 제대로 나온다.
(get_market_ohlcv() 함수를 사용해야 수정주가 조회 가능)
② 한번에 너무 많은 정보를 요청하면 차단당할 수 있기에 'time.sleep(0.5)' 로 회피 필요
③ 가끔 몇몇 종목이 이름이나 티커를 변경하는 이벤트 가 있는데, 다른 종목으로 인식될 수 있으므로 체크 필요
④ 배당금이 조회가 되지 않으므로 , Total Return 수익률 계산을 위해서는 배당금 자료를 외부에서 가져와야 함
↓ Pykrx 라이브러리 깃허브 ↓
pykrx 사용 예시
예를 들어 코스피 시장 에서 모든 상장종목의 주가를 '20년부터 '23년 11월 21일까지 조회하고 싶다면 위의 파이썬 코드를 활용하여 dataframe 형태로 조회가 가능하다.
※ 주의: 해당 코드는 오늘 기준의 코스피 상장종목을 조회한다. 그래서 이전에 코스피시장 에서 상장폐지가 된 종목이나, 신규 상장된 종목의 경우에는 주가가 정상적으로 조회되지 않을 수 있다.
(필요하다면 각 날짜마다 새롭게 상장종목을 조회하여 해당 종목을 대상으로 주가를 조회하는 방식으로 종목 변동을 반영할 수 있다.)
yfinance: yfinance도 국내 시장 조회가 가능하다
원래 yfinance 는 미국시장에서 주식 종목 데이터 조회를 위해 사용하는 라이브러리이다.
그런데 찾아보니 알게된 점, yfinance도 코스피, 코스닥 개별 종목 조회 가 된다!
특히 yfinance 에서는 pykrx 에서 불가능했던 기능이 포함되어 있어서 충분히 사용할 가치가 있어 보인다.
- yfinance 에서 조회 가능한 것과 불가능한 것
- 조회 가능한 것 - High Frequency 주가 데이터 (1분/2분/5분/15분/30분/60분/90분봉), 수정 종가
재무재표 데이터, (잘 나오지는 않지만) 애널리스트 평가와 배당금 등
※ 단, 분봉은 최근 30일 이내, 시간봉은 최근 730일 이내 데이터만 제공한다. 쳇.
- 조회 불가능한 것 - 티커 목록, 실시간 종목 평가지표(PER, PBR 등)
2. yfinance 사용 시 주의사항
① 미국 주식 대상으로는 조회가 되는 배당금, 액면분할, 유/무상증자, 관련 뉴스 가 국내 주식 대상으로는 잘 안된다. 크게 기대하지 말자.
② yfinance 로 조회되는 재무제표 는 최초 공시된 데이터 기반으로 표출된다. (즉, 재무제표 가 이후에 수정되더라도 yfinance 데이터에 반영되지가 않더라. 어쩐지 네이버 증권에 나오는 재무제표 와 데이터가 달랐어)
③ 분봉, 시간봉 데이터 는 조회 가능한 기간 이 별도로 있으므로 주의!
④ yfinance 로는 티커 목록 조회가 되지 않으므로 pykrx 와 같은 타 라이브러리와 함께 사용하는 것을 추천한다.
↓ yfinance 라이브러리 깃허브 ↓[GitHub - ranaroussi/yfinance: Download market data from Yahoo! Finance's API
Download market data from Yahoo! Finance's API. Contribute to ranaroussi/yfinance development by creating an account on GitHub.
github.com
](https://github.com/ranaroussi/yfinance?tab=readme-ov-file)
yfinance 라이브러리로 추출한 코오롱의 최근 1일 분봉 데이터와 재무제표 데이터
이외 라이브러리: FinanceDataReader, pandas-datareader, Open Dart API 등
FinanceDataReader와 pandas-datareader 라이브러리 홈페이지
pykrx 와 yfinance 이외에는 FinanceDataReade r와 pandas-datareader 라이브러리로 국내 주식의 시장 데이터 조회가 가능 하다. 다만 해당 라이브러리의 기능은 왠만하면 pykrx 와 yfinance 가 모두 제공하고 있는 만큼 따로 볼 이유는 없을듯 하다.
아래는 FinanceDataReader 와 pandas-datareader 라이브러리 홈페이지다.[FinanceDataReader 사용자 안내서
FinanceDataReader 사용자 안내서
financedata.github.io
](https://financedata.github.io/posts/finance-data-reader-users-guide.html)[pandas-datareader — pandas-datareader 0.10.0 documentation
pandas-datareader Version: 0.10.0 Date: July 13, 2021 Up-to-date remote data access for pandas. Works for multiple versions of pandas. Quick Start Install using pip pip install pandas-datareader and then import and use one of the data readers. This example reads 5-years of 10-year constant maturity...
pandas-datareader.readthedocs.io
](https://pandas-datareader.readthedocs.io/en/latest/)
Open Dart API
그리고 Open Dart API 의 경우 재무재표 와 공시 데이터 를 받는데 주로 쓰는 편인데, 무료이긴 하나 크롤링 식으로 대량으로 데이터를 긁는다면 IP 차단 이 될 수 있어서 조심해야 되겠다.
아래는 Open Dart API 를 활용하여 데이터를 받아오는 사례를 쓴 글이다.[뇌동매매 금지 - 3. 분기별 재무정보 조회해보기
OpenDartReader를 이용하여 각 종목의 재무정보를 조회해봅니다. 재무 정보 조회하기 OpenDart API Key 발급받기 재무 정보를 조회해야하는데 어떻게 조회해야할지 막막합니다. 일단 기업에서 매 분기마다 발표하는 재무제표를 기반으로한 공시정보를 조회해야합니다. OpenDartReader는 전자재무공시시스템에서 Api key를 이용하여 재무정보를 손쉽게 조회할 수 있게 도와줍니다. https://opendart.fss.or.kr 여기서 회원가입을 하신다음, API Key를 발급받으면 됩니다. 개인의 경우 한도는 1일 최...
drop-by-drop-fills-the-tub.tistory.com
](https://drop-by-drop-fills-the-tub.tistory.com/4)
이외에 나처럼 국내 주식시장의 주가 데이터 를 받기 위해 고생하신 사례가 있어 공유해본다. 이 분은 결국 증권사 API 를 통해 해결하신 모양이다. 나도 알고리즘을 구성해면서 어느 정도 궤도에 올라가면 증권사 API 를 이용해보고자 한다.[Getting historical stock price data — KOAPY 0.9.0 documentation
과거 주식 가격 데이터 확보를 위해 지금까지 삽질해 본 것들 요즘은 집에서 컴퓨터에 설치된 HTS 를 통해 주식을 거래하는 것을 넘어서 스마트폰으로 언제든지 어디서든 주식 가격을 확인하고 거래하는게 가능한 세상이다. 또한 각종 증권사들 뿐만 아니라 다른 다양한 곳에서, 예를 들어 트레이딩뷰 같은 곳에서 제공하는 여러 기본 보조지표들을 포함하는 강력한 차트 툴 처럼, 주식 가격 분석에 활용 가능한 여러 기능들을 탑재한 프로그램들을 제공하고 있어 누구나 쉽게 기본적인 가격 데이터 분석을 시작해 볼 수 있다. 하지만 그렇게 제공되는 기능...
koapy.readthedocs.io
](https://koapy.readthedocs.io/en/latest/notebooks/getting-historical-stock-price-data.html)